package com.un.ebs.customer.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.un.ebs.core.power.PowerResourcManager;
import com.un.ebs.customer.domain.Customer;
import com.un.ebs.customer.domain.CustomerAndDefunctExt;
import com.un.ebs.customer.domain.CustomerExt;
import com.un.ebs.customer.dto.CustomerAddBySuggestDto;
import com.un.ebs.customer.dto.CustomerAddDto;
import com.un.ebs.customer.dto.CustomerRealNameBindRequest;
import com.un.ebs.customer.dto.CustomerUpdateDto;
import com.un.ebs.customer.enums.CustomerStatusEnum;
import com.un.ebs.customer.enums.RemindTypeEnum;
import com.un.ebs.customer.vo.CustomerOrderVo;
import com.un.ebs.sys.dto.AddressDto;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 客户管理服务类
 * </p>
 *
 * @author liubo
 * @since 2019-09-24
 */
public interface CustomerService extends PowerResourcManager {

    /**
     * 添加客户
     *
     * @param req
     * @return
     */
    String add(CustomerAddDto req);

    /**
     * 添加客户，微信渠道
     *
     * @param name
     * @param phone
     * @param openId
     * @return
     */
    String add(String name, String phone, String openId);

    /**
     * 客户介绍
     *
     * @param req
     * @return
     */
    String add(CustomerAddBySuggestDto req);

    /**
     * 修改客户
     *
     * @param req
     */
    void update(CustomerUpdateDto req);

    /**
     * 实名绑定
     *
     * @param req
     */
    void update(CustomerRealNameBindRequest req);

    /**
     * @param id
     * @param openId
     */
    void update(String id, String openId,String name,String phone);

    /**
     * 客户查询
     *
     * @param searchText
     * @param status
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<CustomerExt> query(String searchText, String personnelId, CustomerStatusEnum status, int pageSize, int pageIndex);

    /**
     * 查询客户详情
     *
     * @param id
     * @return
     */
    CustomerExt queryViewById(String id);

    /**
     * 查询客户
     *
     * @param id
     * @return
     */
    Customer queryById(String id);

    Customer queryByUserId(String userId);

    /**
     * 当前用户是否有查询所有客户的权限
     *
     * @return
     */
    boolean hasQueryAllPower();

    /**
     * 根据 customer.user_id 查询客户ID
     *
     * @param id
     * @return
     */
    List<String> queryCustIdByUserId(String id);

    /**
     * 根据当前用户所关联的客户，查询所有通讯地址
     *
     * @param userId
     * @return
     */
    List<AddressDto> queryAddrByUserId(String userId);

    /**
     * 根据手机号码查询客户通讯地址
     *
     * @param phone
     * @return
     */
    List<AddressDto> queryAddrByPhone(String phone);

    /**
     * 根据指定的用户ID查询所关联的客户
     *
     * @param userId
     * @return
     */
    List<CustomerExt> queryViewByUserId(String userId);

    /**
     * 根据指定的openId查询所关联的客户
     *
     * @param openId
     * @return
     */
    List<CustomerExt> queryViewByOpenId(String openId);

    /**
     * 根据手机号码查询客户
     *
     * @param mobile
     * @return
     */
    CustomerExt queryCustViewByMobile(String mobile);

    Customer queryCurrent();

    Customer queryCustByMobile(String mobile);

    Customer queryCustByMobile(String mobile, String tenantId);

    Customer queryCustByWx(String openId,String tenantId);

    /**
     * 查询当前用户的“渠道权限”
     *
     * @return 返回权限ID
     */
    List<String> queryCustSourcePower();

    /**
     * 根据客户ID查询所有的订单
     *
     * @param id
     * @return 返回订单集合
     */
    List<CustomerOrderVo> queryOrderByCustId(String id);

    /**
     * 根据逝者ID查询所有订单
     *
     * @param id
     * @return 返回订单集合
     */
    List<CustomerOrderVo> queryOrderByDefunctId(String id);

    /**
     * 根据逝者ID，查询所有的客户
     *
     * @param id
     * @return
     */
    List<CustomerAndDefunctExt> queryCustAndDefunctByDefunctId(String id);

    /**
     * 根据客户ID，查询所有绑定的逝者
     *
     * @param id
     * @return
     */
    List<CustomerAndDefunctExt> queryCustAndDefunctByCustomerId(String id);

    List<CustomerAndDefunctExt> queryCurrentCustomerAndDefunct();

    /**
     * 查询客户手机号码
     *
     * @param id 客户ID
     * @return 主手机号码
     */
    String queryMobile(String id);

    /**
     * 删除指定的客户
     *
     * @param id
     */
    void delete(String id);

    /**
     * 变更客户负责人
     *
     * @param custId
     * @param personnelId
     * @param remark
     */
    void changePersonnel(String custId, String personnelId, String remark);

    /**
     * 变更客户负责人
     *
     * @param personnelId
     * @param toPersonnelId
     */
    void changePersonnel(String personnelId, String toPersonnelId);

    /**
     * 变更客户负责人，平均分
     *
     * @param personnelId
     * @param toPersonnelIds
     */
    void changePersonnel(String personnelId, List<String> toPersonnelIds);

    /**
     * 变更客户等级
     *
     * @param custId    要变更的客户
     * @param levelDict 目标等级
     * @param remark    变更原因
     */
    void changeLevel(String custId, String levelDict, String remark);

    /**
     * 创建提醒
     *
     * @param custId      客户ID
     * @param type        提醒方式
     * @param personnelId 提醒人员
     * @param remindDate  提醒时间
     * @param remark      提醒备注
     */
    void createRemind(String custId, RemindTypeEnum type, String personnelId, Date remindDate, String remark);

    /**
     * 创建提醒
     *
     * @param custId      客户ID
     * @param type        提醒方式
     * @param personnelId 提醒人员
     * @param nowPlusDay  当天后的多少天
     * @param remark      提醒备注
     */
    void createRemind(String custId, RemindTypeEnum type, String personnelId, Integer nowPlusDay, String remark);

    /**
     * 批量绑定，将客户为指定企业，指定手机号，全部绑定到OpenId
     *
     * @param entId
     * @param phone
     * @param openId
     */
    boolean bindToUser(String entId, String phone, String openId);

    /**
     * 单一绑定，将指定的客户绑定到指定的OpenId
     *
     * @param id
     * @param openId
     */
    void bindToUser(String id, String openId);

    /**
     * 查询已客户与逝者建立了绑定关系的客户，一般产生的购买的，会自动建立关系。
     *
     * @param entId
     * @param searchText
     * @return
     */
    List<CustomerAndDefunctExt> queryBindList(@RequestParam String entId, String searchText);
}
